package cn.wolfcode.util;

import cn.wolfcode.domain.Employee;
import cn.wolfcode.domain.Permission;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpSession;
import java.util.List;

/**
 * 在拦截器中，我们每次请求一次，都要进行复复杂的查询，才能拿到用户拥有的权限表达式
 * 这样的话，性能低，我们可以在登录成功后，进行查询，将其存入session中，这样的话提高性能
 * 注意：这种方式针对于用户的权限不经常变更，模拟用户登录半个钟后注销，重新登入这样就可以刷新权限了
 *       如果要管理员更改权限后，立马刷新使用，那是不可以的
 *
 * 由于我们经常要使用到USER_IN_SESSION,EXPERSSION_IN_SESSION,
 * 我们可以将他们作为常量存入工具类中，贴上注释，这样更加简明之一且方便
 *
 * 流程一：我们可以通过   UserContext.UserContext拿到key，
 *                   httpSession.setAttribute("USER_IN_SESSION", e);  获取
 *
 *                   比如说httpSession.setAttribute("EXPERSSION_IN_SESSION", list);  复制代码时
 *                         修改了key，却没有修改list这样也不会报错
 *                   这样的话，我们设置值的时候，因为value为object对象，所以当我们复制黏贴的时候，复制错了，也不会报错
 *
 * 流程二：     因此我们需要封装一个方法来获取键值对，给顶特定的自定义类型，‘
 *      这样就是具体类型了，错误一下子就显示出来了
 */
public class UserContext {
    public static final  String USER_IN_SESSION = "USER_IN_SESSION";
    public static final  String EXPERSSION_IN_SESSION = "EXPERSSION_IN_SESSION";



    //当我们想要获取和使用session对象时，总是要通过参数request获取或者参数写个HttpSession这样非常麻烦
    //我们可以把获取session写成一个工具方法
    //springmvc给我们提供了
    //这样我们可以随时随地的轻松方便地获取使用session
    public static HttpSession getSession() {
        ServletRequestAttributes attrs =
                (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        return attrs.getRequest().getSession();
    }


    public  static Employee getCurrentEmployee(){
        //从session中获取对象
        return (Employee) getSession().getAttribute(USER_IN_SESSION);
    }

    public  static  List<String> getCurrentExpermission(){
        //从session中获取对象
        return (List<String>) getSession().getAttribute(EXPERSSION_IN_SESSION);
    }


    public  static void setCurrentEmployee(Employee employee){
        //从session中获取对象
         getSession().setAttribute(USER_IN_SESSION,employee);
    }

    public  static  void setCurrentExpermission(List<String> list){
        //从session中获取对象
       getSession().setAttribute(EXPERSSION_IN_SESSION,list);
    }

}
